﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.UI.Xaml;

namespace Scope8
{
    /// <summary>
    /// Diese Klasse repräsentiert ein Slide. Ein Slide ist nach unseren Vorstellungen ein Objekt, das einem Bild sehr ähnlich kommt. Es wird aber zusätlich von einem 
    /// Web-Slide-Server abgefragt, der eine bestimmte Auflösung anhand der Abfrageparamter ermittelt.
    /// </summary>
    class Slide : ISlideManipulate
    {
        /// <summary>
        /// der Name der Bildes
        /// </summary>
        private String _picName = string.Empty;
        /// <summary>
        /// die max. Breite des Bildes
        /// </summary>
        private int _width = 0;
        /// <summary>
        /// die max. Höhe des Bildes
        /// </summary>
        private int _height = 0;
        /// <summary>
        /// der Ordner des Bildes, wo es auf dem Server liegt.
        /// </summary>
        private String _dir = string.Empty;
        /// <summary>
        /// die Server-UR, die abgefragt werden soll
        /// </summary>
        private String _serverURL = string.Empty;
        /// <summary>
        /// das ThumnailPostfix, das die Abfrage-URL angehängt werden soll, falls ein Thumbnail vom Server erhalten werden sollte
        /// </summary>
        private String _thumbnailPostfix = string.Empty;
        
        /// <summary>
        /// Basis Kontruktor des Slide
        /// </summary>
        public Slide()
        {
        }

        /// <summary>
        /// Erzeugt eine Instanz der Klasse mit den angegebenen Werten
        /// </summary>
        /// <param name="newPicName">der Bildname</param>
        /// <param name="newWidth">die max. Breite des Bildes</param>
        /// <param name="newHeight">die max. Höhe des Bildes</param>
        public Slide(String newPicName, int newWidth, int newHeight)
        {
            _picName = newPicName;
            _width = newWidth;
            _height = newHeight;
        }

        /// <summary>
        /// Liefert den Namen des Bildes zurück.
        /// </summary>
        /// <returns>der Name des Bildes inklusive Dateiendung</returns>
        public string getPicName()
        {
            return _picName;
        }

        /// <summary>
        /// Setzt den neuen Namen des Servers
        /// </summary>
        /// <param name="newPicName">der neue Name des Servers</param>
        public void setPicName(string newPicName)
        {
            _picName = newPicName;
        }

        /// <summary>
        /// Liefert die Breite des Bildes zurück
        /// </summary>
        /// <returns>die Breite des Bildes</returns>
        public int getWidth()
        {
            return _width;
        }

        /// <summary>
        /// Setzt die Breite des Bildes
        /// </summary>
        /// <param name="width">die neue Breite des Bildes</param>
        public void setWidth(int width)
        {
            _width = width;
        }

        /// <summary>
        /// Liefert die Höhe des Bildes
        /// </summary>
        /// <returns>die Höhe des Bildes</returns>
        public int getHeight()
        {
            return _height;
        }

        /// <summary>
        /// Setzt die Höhe des Bildes
        /// </summary>
        /// <param name="height"></param>
        public void setHeight(int height)
        {
            _height = height;
        }

        /// <summary>
        /// Setzt die Breite des Bildes.
        /// </summary>
        /// <param name="width">die Breite des Bildes. Die Zeichenkette muss einen Integerwert enthalten.</param>
        public void setWidth(String width)
        {
            _width = Convert.ToInt32(width);
        }

        /// <summary>
        /// Setzt die Höhe des Bildes
        /// </summary>
        /// <param name="height">die Höhe des Bildes. Die Zeichenkette muss einen Integerwert enthalten.</param>
        public void setHeight(String height)
        {
            _height = Convert.ToInt32(height);
        }

        /// <summary>
        /// Setzt den Ordnername des Bildes. Mit Ordnername ist der Name des Ordners auf dem Server gemeint, wo das Bild liegt.
        /// </summary>
        /// <param name="newDir">der neue Ordnername des Bildes auf dem Server</param>
        public void setDir(String newDir)
        {
            _dir = newDir;
        }

        /// <summary>
        /// Liefert den Ordnernamen des Bildes. Mit Ordnername ist der Name des Ordners auf dem Server gemeint, wo das Bild liegt.
        /// </summary>
        /// <returns>der  Ordnername des Bildes auf dem Server</returns>
        public String getDir()
        {
            return _dir;
        }

        /// <summary>
        /// Ermittelt, ob die Klasse nur Standardwerte enthält bzw. Werte enthält mit denen man arbeiten kann.
        /// </summary>
        /// <returns>true, falls die Klasse nicht mit sinnvollen Werten initialisiert wurde, ansonsten false</returns>
        public Boolean empty()
        {
            return (_width == 0 && _height == 0);
        }

        /// <summary>
        /// Setzt die neue Server-URL
        /// </summary>
        /// <param name="newServerURL">die neue Server-URL des Bildes</param>
        public void setServerURL(String newServerURL)
        {
            _serverURL = newServerURL;
        }

        /// <summary>
        /// Liefert die Server URL des Bildes zurück
        /// </summary>
        /// <returns>die Server URL des Bildes</returns>
        public String getServerURL()
        {
            return _serverURL;
        }

        /// <summary>
        /// die vollständige URL des Bildes. z.b. http://http://virtuellemikroskopie.charite.de/wsihandler/vm-serialsections/ISC2012/Hamamatsu/High-Throughput_40x/B-M-A-31-01-40x.ndpi
        /// </summary>
        /// <returns>die vollständige URL des Bildes. z.b. http://http://virtuellemikroskopie.charite.de/wsihandler/vm-serialsections/ISC2012/Hamamatsu/High-Throughput_40x/B-M-A-31-01-40x.ndpi</returns>
        public string getfullUrl()
        {
            return (_serverURL + _dir + _picName);
        }

        /// <summary>
        /// Liefert das Thumbnaiprefix des Bildes. Dieses stellt einen Parameter dar, der an den Server gesendet werden sollte, um ein Thumbnail von diesem Bild zu erhalten.
        /// </summary>
        /// <returns>das Thumbnailprefix des Bildes</returns>
        public String getThumbNails()
        {
            return _thumbnailPostfix;
        }

        /// <summary>
        /// Setzt das Thumbnailprefix des Bildes.Dieses stellt einen Parameter dar, der an den Server gesendet werden sollte, um ein Thumbnail von diesem Bild zu erhalten.
        /// </summary>
        /// <param name="newThumbnail">das neue Prefix</param>
        public void setThumbNails(String newThumbnail)
        {
            _thumbnailPostfix = newThumbnail;
        }

        /// <summary>
        /// Intialisiert das Slide. Methode ist als virtual deklariert, da diese von den Klassen, die davon erben, überschreieben werden soll.
        /// </summary>
        public virtual String InitializeSlide(double viewfildwidth, double viewfildheight)
        {
            return "";
        }

        /// <summary>
        /// Liefert die vollständige URL mit zusätzlichen Abfrageparametern z.B. scrh usw. Methode ist als virtual deklariert, da diese von den Klassen, die davon erben, überschreieben werden soll.
        /// </summary>
        /// <returns></returns>
        public virtual String getManipulatedUrl()
        {
          return "";
        }

        /// <summary>
        /// Stellt ein Pan dar. Siehe: http://en.wikipedia.org/wiki/Multi-touch  Methode ist als virtual deklariert, da diese von den Klassen, die davon erben, überschreieben werden soll.
        /// </summary>
        /// <param name="PosStart">die Position von wo angefangen wird</param>
        /// <param name="PosEnd">die Endpostion</param>
        public virtual void pan(Point PosStart, Point PosEnd)
        {
        }

        /// <summary>
        /// prüft ob überhaupt eine transsormation möglich ist. Methode ist als virtual deklariert, da diese von den Klassen, die davon erben, überschreieben werden soll.
        /// </summary>
        /// <returns>false, falls keine Transformation möglich ist., ansonstne true</returns>
        public virtual Boolean transformationPossible() {
            return false;
        }

        /// <summary>
        /// Zoom in das Bild hinein. Zoom wird bei Touchgeräten mit dem Zeigerfinger und Daumen realisert.       
        /// </summary>
        /// 
        /// <param name="PosStart1">die Position des Zeigerfingers auf dem Touch bevor der Zoomvorgang ausgeführt wurde.</param>
        /// <param name="PosEnd1">die Position des Zeigerfingers auf dem Touch nachdem der Zoomvorgang beendet wurde.</param>
        /// <param name="PosStart2">die Position des Daumens auf dem Touch bevor der Zoomvorgang ausgeführt wurde.</param>
        /// <param name="PosEnd2">die Position des Daumens auf dem Touch nachdem der Zoomvorgang beendet wurde.</param>
        public virtual void zoom(double skaleX, double skaleY)
        {
        }

        /// <summary>
        /// Überprüft ob ein PAN im Slide in X Richtung überhaupt möglich ist oder ob die Grenze des Slides schon erreicht ist
        /// </summary>
        /// <param name="deltaX">die e.Delta verschiebung auf der X Achse</param>
        /// <returns></returns>
        public virtual Boolean xTransPossible(double deltaX)
        {
            return false;
        }


        /// <summary>
        /// Überprüft ob ein PAN im Slide in Y Richtung überhaupt möglich ist oder ob die Grenze des Slides schon erreicht ist
        /// </summary>
        /// <param name="deltaX">die e.Delta verschiebung auf der Y Achse</param>
        public virtual Boolean yTransPossible(double deltaY)
        {
            return false;
        }

        public virtual Boolean zoomPossible(float skale)
        {
            return true;
        }
    }
}
